/******************************************************************************************
 * Import
 ******************************************************************************************/
import _ from 'lodash';
import React, {Component} from 'react';
import Config from '../../config';
import {HttpHesq, HttpText, Session, Storage} from '../../library/func';
import {
    CAround, CBetween, CCenter, CColumn, CHand, CItemX, CItemY, CLine, CRow, CWrap, 
    CIcon, CImage, CSvg, CText,
    CContent, CFloat, CFooter, CHeader, CPage, CSide, 
    CEmpty, CError, CFail, CSkeleton, 
    CLabel, CButton
} from '../../library/comp';


/******************************************************************************************
 * Export Class
 ******************************************************************************************/
export default class ScreenBase extends Component {
    
    /**
     * 初始化
     */
    constructor(props, restful) {
        super(props);
        this.nav = this.props.navigation;
        this.restful = restful;
    }

    /**
     * http加载
     * 
     * @param {Object} 加载页面时的参数
     */
    httpload(param) {

        // 没有load时，直接设置场景为success
        if (!this.restful.httpload) {
            this.setState({
                screen: this.screenSuccess
            });
            return;
        }

        // 有load
        const obj = this.restful.httpload(param);
        HttpText.get({

            // 参数
            url: obj.url,
            data: obj.data,

            // 成功
            success: (data)=> {

                // 设置data
                this.setState({
                    data: data

                // 在setState回调函数中，设置当前场景
                }, ()=> {
                    if (_.has(obj, 'config.isEmpty') && obj.config.isEmpty(data)) {
                        console.warn('HTTP加载状态：空数据（empty）');
                        this.setState({screen: this.screenEmpty});
                        return;
                    }
                    console.log('HTTP加载状态：成功（success）！');
                    this.setState({screen: this.screenSuccess});
                });
            },

            // code出错
            error: (res)=> {
                console.warn('HTTP加载状态：code码出错（codeFail）');
                this.setState({screen: this.screenError});
            },

            // 配置
            config: {

                // 指示器
                indicator: {
                    start() {
                        console.log('httpload start');
                    },
                    end() {
                        console.log('httpload end');
                    }
                },

                // 失败
                fail: {
                    status: (res, obj)=> {
                        console.warn('HTTP加载状态：状态码出错（statusFail）');
                        this.setState({screen: this.screenError});
                    },
                    parse: (text, obj)=> {
                        console.warn('HTTP加载状态：返回值解析出错（parseFail）');
                        this.setState({screen: this.screenError});
                    },
                    format: (text, obj)=> {
                        console.warn('HTTP加载状态：返回值格式出错（formatFail）');
                        this.setState({screen: this.screenError});
                    },
                    network: (err)=> {
                        console.warn('HTTP加载状态：网络出错（networkFail）');
                        this.setState({screen: this.screenFail});
                    }
                }
            }
        });
    }

    /**
     * storage加载
     */
    cacheload() {

        // 没有preload时，直接返回
        if (!this.restful.cacheload) {
            return;
        }

        // 有storageload
        const obj = this.restful.cacheload();
        const data = Session.get(obj.key);

        // 设置data
        this.setState({
            data: data

        // 在setState回调函数中，设置当前场景
        }, ()=> {
            if (obj.isEmpty && obj.isEmpty(data)) {
                console.warn('CACHE加载状态：空数据（empty）');
                this.setState({screen: this.screenEmpty});
                return;
            }
            console.log('CACHE加载状态：成功（success）！');
            this.setState({screen: this.screenSuccess});
        });
    }

    /**
     * 预加载
     * 
     * @param {String} 预加载配置项子键名
     * @param {Object} 加载页面时的参数
     */
    preload(key, param) {

        // 没有preload时，直接返回
        if (!this.restful.preload[key]) {
            return;
        }

        // 有preload
        if (this.restful.preload[key].type == 'http') {
            this.preloadHttp(key, param);
        } else {
            this.preloadCache(key, param);
        }
    }

    /**
     * 预加载
     * 
     * @param {String} 预加载配置项子键名
     * @param {Object} 加载页面时的参数
     */
    preloadHttp(key, param) {

        // 取变量
        const obj = this.restful.preload[key](param);
        const config = obj.config;

        // 访问
        HttpText.get({

            // 参数
            url: obj.url,
            data: obj.data,

            // 成功
            success: (data)=> {
                console.warn(key + '预加载状态：成功（success）');
                // 存储session，并跳转
                Session.set(config.key, config.default);
                this.nav.navigate(config.screen, config.param);
            },

            // code出错
            error: (res)=> {
                console.warn(key + 'code码出错（codeFail）');
                Session.set(config.key, config.default);
                this.nav.navigate(config.screen, config.param);
            },

            // 配置
            config: {

                // 指示器
                indicator: {
                    start() {
                        console.log('preload start');
                    },
                    end() {
                        console.log('preload end');
                    }
                },

                // 失败
                fail: {
                    status: (res, obj)=> {
                        console.warn(key + '预加载状态：状态码出错（statusFail）');
                        Session.set(config.key, config.default);
                        this.nav.navigate(config.screen, config.param);
                    },
                    parse: (text, obj)=> {
                        console.warn(key + '预加载状态：返回值解析出错（parseFail）');
                        Session.set(config.key, config.default);
                        this.nav.navigate(config.screen, config.param);
                    },
                    format: (text, obj)=> {
                        console.warn(key + '预加载状态：返回值格式出错（formatFail）');
                        Session.set(config.key, config.default);
                        this.nav.navigate(config.screen, config.param);
                    },
                    network: (err)=> {
                        console.warn(key + '预加载状态：网络出错（networkFail）');
                        Session.set(config.key, config.default);
                        this.nav.navigate(config.screen, config.param);
                    }
                }
            }
        });
    }

    /**
     * 预加载
     * 
     * @param {String} 预加载配置项子键名
     * @param {Object} 加载页面时的参数
     */
    preloadCache(key, param) {

        // 取变量
        const obj = this.restful.preload[key](param);
        const config = obj.config;

        console.log(config);

        // 存储
        Session.set(config.key, config.data);
        this.nav.navigate(config.screen, config.param);
    }

    

    /**
     * 舞台加载
     */
    screenLoad() {
        return (
            <CContent bg='#ddd' my='60'>
                <CText>正在加载中...</CText>
            </CContent>
        );
    }

    /**
     * 舞台错误
     */
    screenError() {
        return (
            <CContent bg='#ddd' my='60'>
                <CText>加载错误...</CText>
            </CContent>
        );
    }

    /**
     * 舞台失败
     */
    screenFail() {
        return (
            <CContent bg='#ddd' my='60'>
                <CText>加载失败...</CText>
            </CContent>
        );
    }

    /**
     * 空数据
     */
    screenEmpty() {
        return (
            <CContent bg='#ddd' my='60'>
                <CText>空数据</CText>
            </CContent>
        );
    }


    // init() {
    //     let stages = [this.screenLoad, this.screenFail, this.screenError, this.stageEmpty, this.stageSuccess];
    //     let idx = -1;
    //     let timer = setInterval(()=> {
    //         idx = idx + 1;
    //         this.setState({
    //             stage: stages[idx]
    //         });
    //         if (idx == 4) {
    //             clearInterval(timer);
    //         }
    //     }, 3000);
    // }
}
